﻿<?php
error_reporting(0); //禁止报错
set_time_limit(0); 
$response = array();
//$txt = time();
$filename  = dirname(__FILE__).'/data.txt';
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != ''){	//如果有数据传来
	if(file_put_contents($filename,$msg)){  //如果成功写入
		$response['write'] = 'successed'; //返回写入成功
	}else{
		$response['write'] = 'failed';  //返回写入失败
	//	die();
	}	
}

$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;

//取得文件最后修改时间
$currentmodif = filemtime($filename);
while($currentmodif <= $lastmodif){ //阻塞以监听别人发来的消息
	//file_put_contents(dirname(__FILE__).'/'.$txt.'.txt',time()); //生成文件用于调试阻塞连接的，实际使用注释本行即可
  	usleep(100000); //睡0.1秒,有释放CPU占用率的作用  	
  	clearstatcache();//清除文件状态缓存信息，否则用filemtime无法获取最新的最后修改时间
  	$currentmodif = filemtime($filename); //不管任何人发来消息（包括自方发来的）这个阻塞都会被释放，所以保证了同一用户不会出现两个连接的情况
}


// 下面如果是自方发来的消息则被释放出来的阻塞连接不会返回数据(虽然依然执行下面的代码)，因为其连接已经被丢弃，
//为什么呢？因为对同一个客户端来源页面不能同时存在两个连接，旧的连接将被新的连接挤出，所以其与客户端的连接已经丢失
$response['msg'] = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
ob_flush();
flush();
?>